﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Snowflake.Common;

namespace Snowflake.Entity
{
    [Serializable]
    internal class RestorableValueManager
    {
        private IList<IRestorableValue> _RestorableValues;

        public RestorableValueManager()
        {
            this._RestorableValues = new List<IRestorableValue>();
        }

        public void Add(IRestorableValue value)
        {
            this._RestorableValues.Add(value);
        }

        public void AcceptChanges()
        {
            IEnumerable<IRestorableValue> changedValues = this.GetChangedValues();

            foreach (IRestorableValue field in changedValues)
                field.AcceptChanges();
        }

        public void RejectChanges()
        {
            IEnumerable<IRestorableValue> changedValues = this.GetChangedValues();

            foreach (IRestorableValue field in changedValues)
                field.RejectChanges();
        }

        internal IEnumerable<IRestorableValue> GetChangedValues()
        {
            var changedValues = from item in this._RestorableValues
                                where item.HasChanges
                                select item;

            return changedValues.ToArray();
        }

        public void InitalizeFromOriginalStateOf(RestorableValueManager manager)
        {
            int index = 0;

            foreach (IRestorableValue value in manager._RestorableValues)
            {
                if (value.HasChanges)
                    this._RestorableValues[index].Value = value.OriginalValue;
                else
                    this._RestorableValues[index].Value = value.Value;
                    
                index++;
            }

        }
    }
}
